Android学习之调用相机拍摄,并存储到sqllite数据库中,

您所在的位置:网站首页 Android studio 调用手机传感器上传数据 Android学习之调用相机拍摄,并存储到sqllite数据库中,

Android学习之调用相机拍摄,并存储到sqllite数据库中,

2024-01-04 19:46| 来源: 网络整理| 查看: 265

文章目录 1、实现功能2、相关代码3、实现效果4、参考文献5、存在问题

1、实现功能

目前设想的是,通过调用手机自带的相机拍摄照片,然后返回界面,然后存储进入数据库,最后读取出来。 对于数据库存储图片的方式,我的解释,选择目前我最需要的一种方式:BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。 在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。 BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。

2、相关代码

布局界面就是一个xml文件:

数据库部分:MySqlLite

package com.example.wuluo.uidesigen; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by wuluo on 2020/4/11 */ public class MySqlLite extends SQLiteOpenHelper { public MySqlLite(Context context, int version) { //指明上下文,数据库名,工厂默认空值,版本号默认从1开始 super(context, "panzou.db", null, version); } //数据库文件创建成功后调用, @Override public void onCreate(SQLiteDatabase db) { System.out.println("数据库创建"); //图片存储表 db.execSQL("create table test(\n" + "id integer primary key autoincrement,\n" + "name varchar(50),\n" + "vatar blob \n" + ");"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { System.out.println("数据库更新"); } }

变量申明部分:Test

package com.example.wuluo.uidesigen; import android.graphics.Bitmap; import java.io.Serializable; import java.sql.Blob; /** * Created by wuluo on 2020/4/11 */ public class Test implements Serializable { //id private int tid; //部件号 private String tname; //部件名称 private byte[] tvatar; //病害位置 public Test(int id,String name,byte[] vatar){ tid=id; tname=name; tvatar=vatar; } public Test(byte[] vatar){ tvatar=vatar; } public int getTid() { return tid; } public void setTid(int tid) { this.tid = tid; } public String getTname() { return tname; } public void setTname(String tname) { this.tname = tname; } public byte[] getTvatar() { return tvatar; } public void setTvatar(byte[] tvatar) { this.tvatar = tvatar; } }

对表的操作:Testdbop

package com.example.wuluo.uidesigen; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.List; /** * Created by wuluo on 2020/4/11 */ public class Testdbop { private MySqlLite mySqlLite; private SQLiteDatabase database; public void test(Context context) { mySqlLite = new MySqlLite(context, 3); database = mySqlLite.getReadableDatabase(); } //插入 public void insert(Test s){ database.execSQL("insert into test values(?,?,?" + ")",new Object[] {null,null,s.getTvatar()}); System.out.println("插入数据成功"); } //删除 public void delete(int id){ } //更新 public void updata(){ } //查找 public byte[] readImage(){ Cursor cur = database.rawQuery("select * from test", null); byte[] imgData=null; if(cur.moveToNext()){ //将Blob数据转化为字节数组 imgData=cur.getBlob(cur.getColumnIndex("vatar")); } return imgData; } public List getAll(){ List list = new ArrayList(); Cursor cur = database.rawQuery("select * from test", null); byte[] imgData=null; if(cur.moveToNext()){ //将Blob数据转化为字节数组 imgData=cur.getBlob(cur.getColumnIndex("vatar")); list.add(new Test(imgData)); } return list; } }

主函数部分:Main8Activity

package com.example.wuluo.uidesigen; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.sql.Blob; import java.util.ArrayList; import java.util.List; /** * Created by wuluo on 2020/4/11 */ public class Main8Activity extends AppCompatActivity implements OnClickListener{ // private EditText et_2; private ImageView iv_pic; private ImageView iv_pic1; private Button btn_4;//相机 private Button btn_5;//地图 private String url; private DBOperate dbOperate; Testdbop dbop=new Testdbop(); ArrayList binfo1list= new ArrayList(); MySqlLite mySqlLite = new MySqlLite(Main8Activity.this, 1); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main7); iv_pic = findViewById(R.id.iv_pic); iv_pic1 = findViewById(R.id.iv_pic1); btn_4 = (Button) findViewById(R.id.btn_4); btn_4.setOnClickListener(this); btn_5 = (Button) findViewById(R.id.btn_5); btn_5.setOnClickListener(this); dbop.test(this); } @Override public void onClick(View view) { Intent intent = new Intent(); switch (view.getId()){ case R.id.btn_4 : intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); //设置动作为调用照相机 startActivityForResult(intent, 3);//REQUEST_CAMERA请求码 //saveImage(url); break; case R.id.btn_5 : //相机 // readImage(); // dbop.searchall(); System.out.println("开始读取"); byte[] imgData=dbop.readImage(); System.out.println("准备显示"); if (imgData!=null) { //将字节数组转化为位图 Bitmap imagebitmap = BitmapFactory.decodeByteArray(imgData, 0, imgData.length); //将位图显示为图片 iv_pic1.setImageBitmap(imagebitmap); System.out.println("显示成功"); }else { iv_pic1.setBackgroundResource(android.R.drawable.menuitem_background); } break; } } protected void onActivityResult(int requestCode, int resultCode, Intent data) { Bundle bundle = data.getExtras(); if (data == null) return; super.onActivityResult(requestCode, resultCode, data); //Bundle bundle = data.getExtras();// 从data中取出传递回来的数据 System.out.println("开始拍照"); switch (requestCode) { case 0: break; case 3: Bitmap bitmap = (Bitmap) bundle.get("data"); 将data中的信息流解析为Bitmap类型 iv_pic.setImageBitmap(bitmap);// 显示图片 System.out.println("拍照成功"); //将图片转化为位图 int size = bitmap.getWidth() * bitmap.getHeight() * 4; //int size = 20 * 30 * 4; //创建一个字节数组输出流,流的大小为size ByteArrayOutputStream baos= new ByteArrayOutputStream(size); try { //设置位图的压缩格式,质量为100%,并放入字节数组输出流中 bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); //将字节数组输出流转化为字节数组byte[] byte[] imagedata = baos.toByteArray(); Test d=new Test(imagedata); dbop.insert(d); //return imagedata; }catch (Exception e){ }finally { try { //bitmap.recycle(); baos.close(); } catch (IOException e) { e.printStackTrace(); } } break; default: break; } } } 3、实现效果

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 顺便说一下,以后尽量上传GIF吧,图片的展示效果不佳。

4、参考文献

参考文献的话,我也不知道一共看了多少篇的,就目前的话,只有这些: https://blog.csdn.net/qq_43433255/article/details/88374889 https://www.cnblogs.com/wxmdevelop/p/6180424.html https://www.cnblogs.com/xiang1992/p/3428295.html https://blog.csdn.net/CrazyMo_/article/details/54344554?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2 其他的参考,找不到了,但是目前的参考文献,也能做出来了。

5、存在问题

因为这个东西,前前后后弄了5天,因为其他事情,实际的有效时间,可能只有一天左右,也许不到,从设想出发,了解相关的理念,决定方式,然后最后实现出来。总结一句话,书到用时方恨少。 从目前来看,读取照片的设置不是很合理,也就说,读取的时候,只能是最早的一张的照片,而不是最新的,等待优化,考虑用列表展示,比这里的Imageview展示,应该会好很多。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3